// 设置对象(实例级别)的原型

class Beast {
    constructor(type){
        this.type = type ;
    }
    run(){
        console.log( `${this.type} 类动物 ${this.name} 在跑` );
    }
}

class Birds {
    constructor(type){
        this.type = type ;
    }
    fly(){
        console.log( `${this.type} 类动物 ${this.name} 在飞` );
    }
}

class Bat {
    constructor(name){
        this.name = name ;
    }
    // 在 class 中定义的实例方法实际上都定义在对象原型上
    // 在对象的原型上，这些方法都是不可枚举的
    eat(food){
        console.log( `${this.name}在吃${food}`);
    }
}

console.log( Object.getOwnPropertyNames( Bat.prototype ) );

let b = new Bat( 'BAT不是什么好鸟' );
b.eat('虫子');
// 对于实例来说，可以通过 __proto__ 获得相应原型
console.log( b.__proto__ );
console.log( Object.getPrototypeOf( b ) );

const p1 = new Beast( '兽' );
// 修改实例，让其指向的别的原型
b.__proto__ = p1;
// b.eat('虫子'); // TypeError: b.eat is not a function
b.run();

const p2 = new Birds( '禽' );

// 修改实例，让其指向的别的原型
Object.setPrototypeOf( b , p2 );
// b.eat('虫子'); // TypeError: b.eat is not a function
b.fly();